package com.gitee.swsk33.websockethandlerdemo.handler.websocket;

import com.alibaba.fastjson2.JSON;
import com.gitee.swsk33.websockethandlerdemo.model.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.*;

/**
 * 简单的JSON消息处理
 */
@Slf4j
@Component
public class ObjectWebSocketHandler implements WebSocketHandler {

	/**
	 * 连接建立时执行的方法
	 *
	 * @param session WebSocket会话对象
	 */
	@Override
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		log.info("连接已建立！");
		// 可以先序列化为JSON字符串再发送
		User user = new User(1, "哈哈哈");
		String json = JSON.toJSONString(user);
		TextMessage message = new TextMessage(json);
		// 会话send方法把消息发给客户端
		session.sendMessage(message);
	}

	/**
	 * 客户端发来消息时执行的方法
	 *
	 * @param session WebSocket会话对象
	 * @param message 客户端发来的消息对象
	 */
	@Override
	public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) {
		log.info("接收到客户端消息！");
		// 假定用户发来的是User对象，我们进行反序列化
		User getUser = JSON.parseObject(message.getPayload().toString(), User.class);
		log.info("收到对象，id：{}，名字：{}", getUser.getId(), getUser.getName());
	}

	/**
	 * 出现错误时的执行方法
	 *
	 * @param session   WebSocket会话对象
	 * @param exception 出现错误的异常
	 */
	@Override
	public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
		log.error("出现错误！{}", exception.getMessage());
		// 调用会话的close方法可以主动断连
		session.close();
	}

	/**
	 * 断开连接时执行的方法
	 *
	 * @param session     WebSocket会话对象
	 * @param closeStatus 断开连接的状态码
	 */
	@Override
	public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) {
		log.warn("与客户端断开连接！");
	}

	/**
	 * 是否支持部分消息
	 * 不用管保持默认即可
	 */
	@Override
	public boolean supportsPartialMessages() {
		return false;
	}

}